﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class ItemAreaConhecimento
    {
        public ItemAreaConhecimento()
        {
            this.Nome = string.Empty;
        }

        public static List<ItemAreaConhecimento> Listar(ItemAreaConhecimento areaConhecimento)
        {
            if (areaConhecimento == null)
                areaConhecimento = new ItemAreaConhecimento();
            var context = new DataAccess.SistemaCurricularEntities();
            var lista = context.ItemAreaConhecimento.Where(a => a.Descricao.StartsWith(areaConhecimento.Nome) &&
                (areaConhecimento.AreaId == 0 || areaConhecimento.AreaId == a.AreaConhecimentoId) &&
                (areaConhecimento.ItemAreaConhecimentoId == 0 || areaConhecimento.ItemAreaConhecimentoId == a.ItemId) 
                ).ToList().Select(s => areaConhecimento.Create(s)).ToList();
            return lista;
        }

        public string Nome { get; set; }

        public bool Ativo { get; set; }

        public int ItemAreaConhecimentoId { get; set; }

        public int AreaId { get; set; }

        public bool IsNew { get { return this.ItemAreaConhecimentoId == 0; } }

        public bool Salvar()
        {
            DataAccess.ItemAreaConhecimento model = null;
            var retorno = false;
            Transaction.Begin(context =>
            {
                if (this.IsNew)
                    model = this.Insert(context);
                else
                    model = this.Update(context);
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {
                retorno = true;
                this.ItemAreaConhecimentoId = model.ItemId;
            });
            return retorno;
        }

        private DataAccess.ItemAreaConhecimento Insert(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            context.AddToItemAreaConhecimento(item);
            return item;
        }

        private DataAccess.ItemAreaConhecimento Update(DataAccess.SistemaCurricularEntities context)
        {
            var item = this.CreateModel(context);
            return item;
        }

        internal DataAccess.ItemAreaConhecimento CreateModel(DataAccess.SistemaCurricularEntities context, bool loadModel = false)
        {
            DataAccess.ItemAreaConhecimento item = null;
            if (this.IsNew)
                item = new DataAccess.ItemAreaConhecimento();
            else
            {
                item = context.ItemAreaConhecimento.FirstOrDefault(f => f.ItemId == this.ItemAreaConhecimentoId);
                if (item == null)
                    throw new Exception("Còdigo do item inválido");
                if (loadModel)
                    return item;
            }
            item.Descricao = (this.Nome ?? string.Empty).ToUpper();
            item.AreaConhecimentoId = this.AreaId;
            item.Ativo = this.Ativo;
            item.ItemId = this.ItemAreaConhecimentoId;
            return item;
        }

        internal Lib.ItemAreaConhecimento Create(DataAccess.ItemAreaConhecimento model)
        {
            if (model == null)
                return null;
            var item = new ItemAreaConhecimento();
            item.Nome = model.Descricao;
            item.AreaId = model.AreaConhecimentoId;
            item.Ativo = model.Ativo;
            item.ItemAreaConhecimentoId = model.ItemId;
            return item;
        }

        public bool Excluir()
        {
            bool retorno = false;
            Transaction.Begin((context) =>
            {
                context.ItemAreaConhecimento.DeleteObject(this.CreateModel(context));
                retorno = true;
                return true;
            }).OnError(exception =>
            {
                throw exception;
            }).OnSuccess(() =>
            {

            });
            return retorno;
        }
    }
}
